package com.jiwei.system.service;

import com.jiwei.system.pojo.ResultPoJo;

import java.util.HashMap;
import java.util.Map;

/**
 * @title: UserLogin
 * @Author 赖志宇
 * @Description 策略模式，只有一个登陆方法
 * @Date: 2020/8/16
 * @Version 1.0
 */
public interface LoginService<T> {
    /**
     * 用于存储对象和对应的登录方式，实现策略模式的核心点
     */
    Map<String, LoginService> userLoginMethodMap = new HashMap();

    /**
     * 用于登录
     * @param t 传入的登录数据模型
     * @return 返回一个结果集，里面包含了状态码，携带的信息，以及一些数据集合，这里一般是token
     */
    default ResultPoJo login(T t) {
        ResultPoJo resultPoJo = beforeLogin(t);
        if(resultPoJo!=null)
            return resultPoJo;
        if(verifyLogin(t).getStatusCode().equals("200"))
            return loginSuccess(t);
        else
            return loginFail(t);

    }

    /**
     * 验证登录凭证是否正确
     * @param t 传入的数据模型可
     * @return 结果集，但一般是状态码，具体的信息应该在success or fail 中实现
     */
    ResultPoJo verifyLogin(T t);

    /**
     * 登录前的一些操作，这个方法是预留的，以后可能会有黑名单或者封号、多次密码错误冻结等操作
     * @param t 数据模型
     * @return  结果集 message中可能会包含具体失败的原因
     */
    ResultPoJo beforeLogin(T t);

    /**
     * 登录失败的操作
     * @param t 登录模型
     * @return
     */
    ResultPoJo loginFail(T t);
    ResultPoJo loginSuccess(T t);

}
